home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 32
/
Mac Magazin and MacEasy Magazine CD - Issue 32.iso
/
Multimedia
/
MIDI
/
MidiChaos_15 Folder
/
MidiChaos_1.5
/
Source
/
Chaotic_critter
next >
Wrap
Text File
|
1995-04-28
|
4KB
|
198 lines
\ This class will generate integer output from chaotic equations.
\
\ Author: Darren Gibbs Copyright 1990
\ Date: 4/24/90
\
\ MOD: RDG 5/22/90 Restructured for polyphony.
\ MOD: RDG 10/1/90 Added new equations; Added FP ivars, made into object!
ANEW TASK-CHAOTIC_CRITTER
3.1415926536 FCONSTANT PI
4 CONSTANT #FUNCTIONS
0 CONSTANT TRIG
1 CONSTANT KAC
2 CONSTANT LOGISTICS
3 CONSTANT INSECT
\ Define the functions.
: TRIG.FUNC ( -- ) ( p1 p2 x -- x' )
\ x' = p1 sin(pi * x)
\ 0 < x < 1 ; 0 < p1 < 1
FSWAP FDROP \ don't need p2
PI F* FSIN F*
;
: KAC.FUNC ( -- ) ( p1 p2 x -- x' )
\ x' = p1 x for x < .50
\ x' = p1(1 - x) for x > .50
\ 0 < x < 1 ; 1 < p1 < 2
FSWAP FDROP \ don't need p2
FDUP .50 F<
IF F*
ELSE 1.00 FSWAP F- F*
THEN
;
: LOGISTICS.FUNC ( -- ) ( p1 p2 x -- x' )
\ x' = p1 x (1 - x)
\ 0 < x < 1 ; 0 < p1 < 4
FSWAP FDROP \ don't need p2
FDUP 1.00 FSWAP F- F* F*
;
: INSECT.FUNC ( -- ) ( p1 p2 x -- x' )
\ x' = p1 x (1 + x) EXP -p2
\ 0 < x < 1 ; 1 < p2 < 10 ; 1 < p1 < 1000
FDUP 1.00 F+
FROT ( p1 x x+1 p2 -- )
FNEGATE F**
F* F*
;
CREATE FUNCTION-LIST
'c trig.func a, 'c kac.func a,
'c logistics.func a, 'c insect.func a,
: INDEX>CFA ( index -- CFA , get CFA from index. )
function-list swap cell* + a@
;
TEXTROM FUNCTION-NAMES ," Trig" ," Kac" ," Logistics" ," Insect"
: GET.FUNCTION.NAME ( index -- text ) ( -- )
function-names
;
: GET.#FUNCTIONS ( -- n ) ( -- )
#functions
;
: GET.FUNCTION.MIN/MAX ( index -- p1min p1max p2min p2max ) ( -- )
CASE
TRIG OF 1 99 0 ENDOF \ flags will disable fader
KAC OF 1 199 0 ENDOF
LOGISTICS OF 101 399 0 ENDOF
INSECT OF 101 9999 0 999 ENDOF
ENDCASE
;
: GET.FUNCTION.NOMINAL ( index -- p1-nom p2-nom ) ( -- )
CASE
TRIG OF 70 0 ENDOF
KAC OF 80 1 ENDOF
LOGISTICS OF 200 1 ENDOF
INSECT OF 500 50 ENDOF
ENDCASE
;
\ -------------------------------------------------------------------------------
\ Begin class definition
\ -------------------------------------------------------------------------------
METHOD PUT.P1: METHOD GET.P1:
METHOD PUT.P2: METHOD GET.P2:
METHOD PUT.X: METHOD GET.X:
METHOD GET.FUNCTION: METHOD USE.FUNCTION:
METHOD EXEC.FP:
:CLASS OB.CHAOTIC_CRITTER <SUPER OBJECT
IV.FLPT IV-P1
IV.FLPT IV-P2
IV.FLPT IV-X
IV.LONG IV-CURRENT-FUNCTION
OB.FP_LINEAR_SCALER IO-SCALING
:M PUT.P1: ( r -- ) ( -- )
i>f 100.0 f/ iv=> iv-p1
;M
:M GET.P1: ( -- p ) ( -- )
iv-p1 100.0 f* f>i
;M
:M PUT.P2: ( b -- ) ( -- )
i>f 100.0 f/ iv=> iv-p2
;M
:M GET.P2: ( -- b ) ( -- )
iv-p2 100.0 f* f>i
;M
:M PUT.X: ( x -- ) ( -- )
i>f 100.0 f/ iv=> iv-x
;M
:M GET.X: ( -- x ) ( -- )
iv-x 100.0 f* f>i
;M
:M PUT.MIN: ( min -- ) ( -- )
i>f put.ylow: io-scaling
;M
:M PUT.MAX: ( max -- ) ( -- )
i>f put.yhi: io-scaling
;M
:M GET.MIN: ( -- ) ( -- min )
get.ylow: io-scaling f>i
;M
:M GET.MAX: ( -- ) ( -- max )
get.yhi: io-scaling f>i
;M
:M EXEC: ( -- x ) ( -- )
iv-p1 iv-p2 iv-x
iv-current-function execute
fdup iv=> iv-x
scale>int: io-scaling
;M
:M EXEC.FP: ( -- ) ( -- x )
iv-p1 iv-p2 iv-x
iv-current-function execute
fdup iv=> iv-x
;M
:M USE.FUNCTION: ( index -- ) ( -- )
dup get.function.nominal ( index p1-nom p2-nom -- )
put.p2: self \ set params to reasonable values
put.p1: self
50 put.x: self
index>cfa iv=> iv-current-function
;M
:M GET.FUNCTION: ( -- index ) ( -- )
#functions 0 DO
I index>cfa iv-current-function =
IF I leave
THEN
LOOP
;M
:M PRINT: ( -- ) ( -- )
cr name: self cr
." Function: " get.function: self get.function.name type cr
." P1: " get.p1: self . cr
." P2: " get.p2: self . cr
." X: " get.x: self . cr
." Min Output: " get.min: self . cr
." Max Output: " get.max: self . cr
;M
:M INIT: ( -- )
init: super
trig index>cfa iv=> iv-current-function
70 put.p1: self
0 put.p2: self
80 put.x: self
0.0 1.0 0.0 127.0 stuff: io-scaling
;M
;CLASS